package iface.aplicativo.apresentacao.controle;

import iface.aplicativo.excecao.MensagemException;
import iface.aplicativo.negocio.aps.CadastrarEntradaAPS;
import iface.aplicativo.negocio.entidade.EntradaVeiculo;
import iface.aplicativo.negocio.entidade.Pessoa;
import iface.aplicativo.negocio.entidade.Veiculo;
import iface.aplicativo.util.BeanAbstrato;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.model.SelectItem;

import org.primefaces.event.SelectEvent;

@ManagedBean
@SessionScoped
public class CadastrarEntradaBean extends BeanAbstrato implements Serializable {

	private static final long serialVersionUID = 4285899560377776076L;
	private EntradaVeiculo entradaVeiculo;
	private EntradaVeiculo entradaVeiculoAux;

	@ManagedProperty(value = "#{cadastrarEntradaAPS}")
	private CadastrarEntradaAPS service;

	public void setService(CadastrarEntradaAPS service) {
		this.service = service;
	}

	public void cadastrarEntrada() throws Exception {

		try {
			String msg = this.service
					.cadastrarEntrada(this.getEntradaVeiculo());

			this.limparCampos();

			this.setMensagem(msg, MSG_TIPO_INFORMACAO, "");
		} catch (final MensagemException e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_AVISO, "");
		} catch (final Exception e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_ERRO, "");
		}
	}

	public void excluirEntradaVeiculo() throws Exception {

		try {
			String msg = this.service.excluirEntradaVeiculo(this
					.getEntradaVeiculoAux());

			this.limparCampos();

			this.setMensagem(msg, MSG_TIPO_INFORMACAO, "");
		} catch (final MensagemException e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_AVISO, "");
		} catch (final Exception e) {
			this.setMensagem(e.getMessage(), MSG_TIPO_ERRO, "");
		}
	}

	public void limparCampos() {
		this.setEntradaVeiculo(null);
		this.setEntradaVeiculoAux(null);
	}

	public Collection<Veiculo> consultarVeiculosPorPlaca(String query) {
		Collection<Veiculo> results = this.service
				.consultarVeiculosPorPlaca(query);

		return results;
	}

	public Collection<Pessoa> consultarFornecedoresPorNome(String query) {
		return this.service.consultarFornecedoresPorNome(query);
	}

	public Collection<Pessoa> consultarDespachantesPorNome(String query) {
		return this.service.consultarDespachantesPorNome(query);
	}

	public Collection<EntradaVeiculo> getTodosCadastroEntrada() {
		return this.service.consultarTodosCadastroEntrada();
	}

	public List<SelectItem> getConsultarSimNao() {
		return this.service.consultarSimNao();
	}

	public List<SelectItem> getConsultarSituacaoDocumento() {
		return this.service.consultarSituacaoDocumento();
	}

	public void handleSelectVeiculo(SelectEvent event) throws Exception {
		this.getEntradaVeiculo().setVeiculo((Veiculo) event.getObject());
	}

	public void handleSelectFornecedor(SelectEvent event) throws Exception {
		this.getEntradaVeiculo().setFornecedor((Pessoa) event.getObject());
	}

	public void handleSelectDespachante(SelectEvent event) throws Exception {
		this.getEntradaVeiculo().setDespachante((Pessoa) event.getObject());
	}

	public EntradaVeiculo getEntradaVeiculo() {
		if (entradaVeiculo == null) {
			entradaVeiculo = new EntradaVeiculo();
			entradaVeiculo.setFornecedor(new Pessoa());
			entradaVeiculo.setVeiculo(new Veiculo());
			entradaVeiculo.setDespachante(new Pessoa());
		}
		return entradaVeiculo;
	}

	public void setEntradaVeiculo(EntradaVeiculo entradaVeiculo) {
		this.entradaVeiculo = entradaVeiculo;
	}

	public EntradaVeiculo getEntradaVeiculoAux() {
		if (entradaVeiculoAux == null) {
			entradaVeiculoAux = new EntradaVeiculo();
			entradaVeiculoAux.setFornecedor(new Pessoa());
			entradaVeiculoAux.setVeiculo(new Veiculo());
			entradaVeiculoAux.setDespachante(new Pessoa());
		}
		return entradaVeiculoAux;
	}

	public void setEntradaVeiculoAux(EntradaVeiculo entradaVeiculoAux) {
		this.entradaVeiculoAux = entradaVeiculoAux;
	}

}
